import Vue from 'vue'
import Utils from './index'

/**
 * 对跳转方法的封装
 * @param {*} url 链接地址
 * @param {*} type 打开类型
 * @param {*} anim 动画类型
 * @param {*} time 动画时间
 * 例子：
 * 1. 不带参数 open('/extend/web-view/web-view')
 * 2. 非 navigateTo 跳转类型 open('/extend/web-view/web-view', 'st')
 * 3. 带参数跳转 open('/extend/web-view/web-view', 'nt', { data: xxx })
 */
export const open = (Vue.prototype.$open = (url, type = 'nt', data, anim = 'pop-in', time = 300) => {
  const finalUrl = data ? `/pages${url}?data=${encodeURIComponent(JSON.stringify(data))}` : `/pages${url}`
  const param = { url: finalUrl, animationType: anim, animationDuration: time }

  if (typeof type === 'object') return console.log(`第二参数需填写打开类型，正确使用示例：open('/path/..', 'nt', { key: value })`)

  if (type === 'nt' || type === '' || type === 'navigateTo') {
    // 保留当前页面，跳转到应用内的某个页面。
    uni.navigateTo(param)
  } else if (type === 'rt' || type === 'redirectTo') {
    // 关闭当前页面，跳转到应用内的某个页面。
    uni.redirectTo(param)
  } else if (type === 'rl' || type === 'reLaunch') {
    // 关闭所有页面，打开到应用内的某个页面。
    uni.reLaunch(param)
  } else if (type === 'st' || type === 'switchTab') {
    // 跳转到 tabBar 页面，并关闭其他所有非 tabBar 页面。
    uni.switchTab(param)
  } else if (type === 'nb' || type === 'navigateBack') {
    // 关闭当前页面，返回上一页面或多级页面。
    uni.navigateBack({ delta: url, animationType: anim, animationDuration: time })
  }
})

export const msg = (Vue.prototype.$msg = (type = 'text', text, obj) => {
  const param = {
    duration: (obj && obj.duration) || 3000, //提示的延迟时间，单位毫秒，默认：3000
    mask: (obj && obj.mask) || false, //显示透明蒙层，防止触摸穿透,
    success: (obj && obj.success) || null, //成功回调
    fail: (obj && obj.fail) || null //失败回调
  }
  switch (type) {
    case 'text': {
      param.title = text || ''
      param.icon = 'none'
      break
    }
    case 'loading': {
      param.title = text || ''
      param.icon = 'loading'
      break
    }
    case 'success': {
      param.title = text || ''
      param.image = '/static/images/msg/msg-success.png'
      break
    }
    case 'warning': {
      param.title = text || ''
      param.image = '/static/images/msg/msg-warning.png'
      break
    }
    case 'error': {
      param.title = text || ''
      param.image = '/static/images/msg/msg-error.png'
      break
    }
    case 'info': {
      param.title = text || ''
      param.image = '/static/images/msg/msg-info.png'
      break
    }
    default: {
      break
    }
  }
  uni.showToast(param)
})

/**
 * 获取用户当前所在的页面栈
 * getCurrentPages 为 uni 提供的内部方法 , 可直接使用
 */
export const getCurrentPage = (Vue.prototype.$currentPage = () => {
  const pages = getCurrentPages()
  return pages[pages.length - 1].route
})

/**
 *  判断当前页面栈是否在 route 路径
 *  currentPageIn('$url‘)
 *  例子 ： currentPageIn('/login/login‘)
 */
export const currentPageIn = (Vue.prototype.$currentPageIn = route => {
  const currentPage = getCurrentPage()
  return currentPage.indexOf(route) > 0
})

/**
 * 解析通过 open 方法传递到另外一个页面栈到数据
 * 接收通过 onLoad(option) 或者 created(option) 里面获取的 option 值
 */
export const $encode = (Vue.prototype.$encode = (option, key = 'data', type = 'Object') => {
  // option Object , data String, param Object
  if (!option) return null
  if (!option[key]) return null

  const decodeData = decodeURIComponent(option[key])
  
  if (type === 'Object') {
    if (!decodeData || Utils.isEmpty(decodeData)) return null
    const param = JSON.parse(decodeData) || null
    return param
  }

  return decodeData
})
